iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
AI/ ML & Data

使用 jq 處理資料系列 第 8

Day8: jq filter 組合使用 pipe

  • 分享至 

  • xImage
  •  

昨天學了 jq filter 利用陣列索引取得陣列中的元素,今天來看看多個 filter 如何組合使用。

對話中學習

師傅:徒弟,有聽過 pipe嗎?

徒弟:pipe?是不是像水管一樣的東西?

師傅:差不多。在 jq 裡,pipe 就是 | 符號。它能把左邊的輸出餵給右邊。

徒弟:哦...那實際上怎麼用呢?

師傅:看好了。jq ".[] | .title" todos.json

徒弟:這...這是在做什麼?

師傅.[] 先把陣列拆開,然後 pipe 把每個元素傳給 .title。懂了嗎?

徒弟:我想我明白了。那如果我想找特定的資料呢?

師傅:用 select。試試這個:jq ".[] | select(.completed == true) | .title" todos.json

徒弟:哇!這是在找所有完成的 TODO 的標題嗎?

師傅:沒錯。select 就像個篩子,只讓符合條件的過去。

徒弟:太酷了!我可以試試找未完成的 TODO 嗎?

師傅:去吧,小子。讓我看看你學到了什麼。

徒弟:好,我試試...jq ".[] | select(.completed == false) | .title" todos.json

師傅:不錯嘛。看來你開始掌握竅門了。

pipe | 運算子

昨天有練習過,將 TODO 陣列所有元素的 Title 屬性值回傳的指令是:

jq ".[].title" todos.json

這個做法等同於

jq ".[] | .title" todos.json`

兩種做法結果雖然一致,但寫法有一點差異;那就是第二種指令使用了 | 。如果第一眼沒看出差別的話,可以多瞄幾眼。

| pipe 運算子組合了兩個 filter,第一個是 .[] 列出陣列中所有元素,第二個是 .title 取出物件 title 屬性的值。其中 pipe 組合的方式就是把第一個 filter 的輸出值,作為第二個 filter 的輸入值。

仔細想想,原本這個 filter 要處理的資料,是有 200 個元素的一個陣列,而最後輸出結果時,成了 200 個字串。數量從 1 變成 200 ,主要是第一個 filter .[] 列出所有元素的動作時,輸出結果就有兩百個物件元素;從物件到取得 title 屬性值,就是第二個 filter .title Object Identifier-Index (物件屬性識別索引) 的作用。

No. filter input output
1 .[] [{}x200] {}x200
2 .title {}x200 "$title"x200

看起來,只要我們想要組合多個 filter , | pipe 就可以派上用場~

select 過濾函式

select(boolean_expression) 是 jq filter 很常見的過濾資料函式。如果括弧內的 boolean_expression 為 true ,則函式會輸出其輸入的值;否則就不輸出。

  • 從陣列中找出 completed 屬性值為 true 的物件,並輸出他的 title 屬性值,指令如下:
jq ".[] | select(.completed == true) | .title" todos.json
  • 從陣列中找出 completed 屬性值為 false 的物件,並輸出他的 title 屬性值,指令如下:
jq ".[] | select(.completed == false) | .title" todos.json

結論

今天學到用 | 組合多個 filter,並認識了有用的過濾函式 select(),感覺自己越來越厲害了!👍😁感謝自己持續的努力。👓✨


上一篇
Day7: 使用 jq filter 處理 JSON 陣列
下一篇
Day9 : jq filter 條件式
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言